// Util.hpp
#pragma once
#include <sstream>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
using namespace std;
// static int i=0;

// 坑：一般网页文件，都是文本的
// 但是如果是图片，视频，音频-> 二进制的
string Split(string &payload, const string &sep)
{
        // 找sep
        auto pos = payload.find(sep, 0);
        if (pos == string::npos)
        {
            // 如果没找到
            return "";
        }
        // 将pos位置前的数据分割出来，传回去
        //如果pos等于字符串的长度，该函数返回一个空字符串
        string result = payload.substr(0, pos);

        // cout<<i++<<":"<<result<<endl;//--debug
       
        // 已经搜寻过的数据直接就删掉，pos正好表示前面的数据个数，加上sep的大小即可删除
        payload.erase(0, pos + sep.size());
        return result;
}

void AnalysisRequestLine(string &request_line, string &method, string &url, string &version)
{
    stringstream ss(request_line);
    ss >> method;
    string tmp;
    // url初始化时已经有了，不能直接流插入，所以说这边需要一个临时对象过渡
    ss >> tmp;
    url += tmp;
    ss >> version;
    LogMessage(Information, "Analysis done...");
}

// 读取客户端请求的url中的内容，作为响应的有效载荷（响应正文）
bool ReadFile(const string &path, string &body)
{
    LogMessage(Information, "this file is %s", path.c_str());
     // 读文件--做好放在stat之前，保证没有文件直接返回，防止给body瞎resize
    int fd = open(path.c_str(), O_RDONLY);
      if (fd == -1)
    {
        return false;
    }
    struct stat st;
    // 获取文件的属性->文件大小，提前开好空间，改变size
    stat(path.c_str(), &st);
    body.resize(st.st_size);
 
    // 即使是string对象，现在也可以直接强转指针，进行读取，因为前面已经改变过size了
    read(fd, (void *)body.c_str(), body.size());
    close(fd);
    LogMessage(Information, "ReadFile done...");
    return true;
}